home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BPNN133U.ZIP / BPRECOG.C next >
C/C++ Source or Header  |  1992-11-19  |  5KB  |  209 lines

  1. /*
  2. *-----------------------------------------------------------------------------
  3. *    file:    bprecog.c
  4. *    desc:    recognizing program
  5. *    by:    patrick ko
  6. *    date:    20 aug 1991
  7. *    revi:    v1.32u 26 apr 1992
  8. *-----------------------------------------------------------------------------
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #ifdef __TURBOC__
  14. #include <mem.h>
  15. #include <alloc.h>
  16. #endif
  17.  
  18. #include "nntype.h"
  19. #include "nncreat.h"
  20. #include "nntrain.h"
  21. #include "nnerror.h"
  22. #include "cparser.h"
  23. #include "bprecogv.h"
  24.  
  25. #define MAXHIDDEN    128
  26.  
  27. static INTEGER    hiddencnt = 0;
  28. static INTEGER    hidden[MAXHIDDEN];
  29. static INTEGER    output;
  30. static INTEGER    input;
  31. static INTEGER    totalhidden;
  32. static INTEGER    totalpatt = 0;
  33.  
  34. static VECTOR    **inputvect;
  35. static VECTOR    **targtvect;
  36.  
  37. static char    tfilename[128];
  38.  
  39. /*
  40. *    default dump file name
  41. */
  42. static char    dfilename[128] = "bptrain.dmp";
  43. static char    ofilename[128] = "bprecog.out";
  44.  
  45. int    usage( )
  46. {
  47.     printf( "%s %s - by %s\n", PROGNAME, VERSION, AUTHOR );
  48.     printf( "(C)Copyright 1992 All Rights Reserved. %s\n\n", DATE );
  49.     printf( "Description: backprop neural net recognition\n");
  50.     printf( "Usage:\n%s @file -i=# -o=# -hh=# {-h=#} -samp=# -frecog=<fn> [-fdump=<fn>] -fout=<fn>\n\n", PROGNAME );
  51.     printf( "Examples:\n" );
  52.     printf( "Recognize 2 patterns in myinput.rgn with the NN created in bptrain example 1\n" );
  53.     printf( "and generate a result file result.out:\n" );
  54.     printf( "%s -i=2 -o=1 -hh=2 -h=3 -h=4 -samp=2 -frecog=myinput.rgn -fout=result.out\n", PROGNAME );
  55.     printf( "\n" );
  56.     printf( "Where\n\n" );
  57.     printf( "-i=         dimension of input layer\n" );
  58.     printf( "-o=         dimension of output layer\n" );
  59.     printf( "-hh=        number of hidden layers\n" );
  60.     printf( "-h=         each hidden layer dimension (may be multiple)\n" );
  61.     printf( "-samp=      number of train input patterns in train file\n" );
  62.     printf( "-frecog=    name of recog file containing inputs\n" );
  63.     printf( "-fdump=     name of neural net file dumped by bptrain\n" );
  64.     printf( "-fout=      name of recognition result file\n" );
  65.     exit (1);
  66. }
  67.  
  68. int parse( )
  69. {
  70.     int    cmd;
  71.     char    rest[128];
  72.     int    resti;
  73.  
  74.     while ((cmd = cmdget( rest ))!= -1)
  75.         {
  76.         resti = atoi(rest);
  77.         switch (cmd)
  78.             {
  79.             case CMD_DIMINPUT:
  80.                 input = resti; break;
  81.             case CMD_DIMOUTPUT:
  82.                 output = resti; break;
  83.             case CMD_DIMHIDDENY:
  84.                 if (input <= 0 || output <= 0)
  85.                     {
  86.                     error( NNIOLAYER );
  87.                     }
  88.                 if (resti > MAXHIDDEN)
  89.                     {
  90.                     error( NN2MANYLAYER );
  91.                     }
  92.                 totalhidden = resti; break;
  93.             case CMD_DIMHIDDEN:
  94.                 if (hiddencnt >= totalhidden)
  95.                     {
  96.                     /*
  97.                     * hidden layers more than specified
  98.                     */
  99.                     break;
  100.                     }
  101.                 hidden[hiddencnt++] = resti;
  102.                 break;
  103.             case CMD_RECOGFILE:
  104.                 strcpy( tfilename, rest );
  105.                 break;
  106.             case CMD_TOTALPATT:
  107.                 totalpatt = resti;
  108.                 break;
  109.             case CMD_DUMPFILE:
  110.                 strcpy( dfilename, rest );
  111.                 break;
  112.             case CMD_OUTFILE:
  113.                 strcpy( ofilename, rest );
  114.                 break;
  115.             case CMD_COMMENT:
  116.                 break;
  117.             case CMD_NULL:
  118.                 printf( "unknown command [%s]\n", rest );
  119.                 exit (2);
  120.                 break;
  121.             }
  122.         }
  123.         if (hiddencnt < totalhidden)
  124.             {
  125.             error( NN2MANYHIDDEN );
  126.             }
  127. }
  128.  
  129. int getrecogvect( recogfile )
  130. char    *recogfile;
  131. {
  132.     int    i, j, cnt;
  133.     VECTOR    *tmp;
  134.     FILE    *ft;
  135.  
  136.  
  137.     ft = fopen( recogfile, "r" );
  138.     if (ft == NULL)
  139.         {
  140.         error( NNRFRERR );
  141.         }
  142.  
  143.     inputvect = (VECTOR **) malloc( sizeof(VECTOR *) * totalpatt );
  144.  
  145.     for (i=0; i<totalpatt; i++)
  146.         {
  147.         /*
  148.         *    allocate input patterns
  149.         */
  150.         tmp = v_creat( input );
  151.         for (j=0; j<input; j++)
  152.             {
  153.             cnt = fscanf( ft, "%lf", &tmp->vect[j] );
  154.             if (cnt < 1)
  155.                 {
  156.                 error( NNTFIERR );
  157.                 }
  158.             }
  159.         *(inputvect + i) = tmp;
  160.         }
  161.     fclose( ft );
  162. }
  163.  
  164.  
  165. int main( argc, argv )
  166. int    argc;
  167. char    **argv;
  168. {
  169.     INTEGER    i;
  170.     NET    *nn;
  171.     FILE    *fdump, *fout;
  172.  
  173.     if (argc < 2)
  174.         {
  175.         usage();
  176.         }
  177.     else
  178.         {
  179.         cmdinit( argc, argv );
  180.         parse();
  181.         }
  182.  
  183.     /*
  184.     *    create a neural net
  185.     */
  186.     nn = nn_creat( totalhidden + 1, input, output, hidden );
  187.  
  188.     printf( "opening dump file [%s] ...\n", dfilename );
  189.     fdump = fopen( dfilename, "r" );
  190.     nn_load( fdump, nn );
  191.     fclose( fdump );
  192.  
  193.     printf( "start recognizing...\n" );
  194.     getrecogvect( tfilename );
  195.  
  196.     fout = fopen( ofilename, "w" );
  197.     if (fout == NULL)
  198.         {
  199.         error (NNOUTNOTOPEN);
  200.         }
  201.     for (i=0; i<totalpatt; i++)
  202.         {
  203.         nnbp_forward( nn, *(inputvect + i) );
  204.         nn_dumpout( fout, nn );
  205.         }
  206.     fclose( fout );
  207. }
  208.  
  209.